package com.zh.listener;

import com.alibaba.fastjson.JSON;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.util.Map;

@Configuration
public class DieDirectReceiver3 {

    @RabbitListener(queues = "TestDeadQueue") //监听队列的名称
    @RabbitHandler
    public void processDirect( Message message, Channel channel) throws IOException {
        try {
            System.out.println("TestDeadQueue消费者受到的消息："+new String(message.getBody() ));
            /**
             * 拒绝消费
             * 如果第二参数传入true，就是将数据重新丢回队列里，那么下次还会消费这消息。设置false，
             * 就是告诉服务器，我已经知道这条消息数据了，因为一些原因拒绝它，而且服务器也把这个消息丢掉就行。 下次不想再消费这条消息了
             */
            channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
        }catch (Exception e){
            channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
            e.printStackTrace();
        }
    }

    @RabbitListener(queues = "DeadQueue") //死信监听队列的名称
    @RabbitHandler
    public void processDieDirect(Message message, Channel channel) throws IOException {
        try {
            System.out.println("DeadQueue死信队列消费：："+new String(message.getBody() ));
            // 确认消费 ，第二个参数是 是否批量消费true:将一次性ack所有小于deliveryTag的消息。
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        }catch (Exception e){
            /**
             * 拒绝消费
             * 如果第二参数传入true，就是将数据重新丢回队列里，那么下次还会消费这消息。设置false，
             * 就是告诉服务器，我已经知道这条消息数据了，因为一些原因拒绝它，而且服务器也把这个消息丢掉就行。 下次不想再消费这条消息了
             */
            channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
            e.printStackTrace();
        }
    }

}
